#include<bits/stdc++.h>
using namespace std;
int n,m,root[600010],cnt,pre;
struct point
{
	int val,lc,rc;
}p[15000100];
int insert(int last,int i,int x)
{
	int o=++cnt;
	if(!i)
	{
		p[o].val=p[last].val+1;
		return o;
	}
	int k=(x>>(i-1))&1;
	if(k)
	{
		p[o].lc=p[last].lc;
		p[o].rc=insert(p[last].rc,i-1,x);
	}
	else
	{
		p[o].rc=p[last].rc;
		p[o].lc=insert(p[last].lc,i-1,x);
	}
	p[o].val=p[p[o].lc].val+p[p[o].rc].val;
	return o;
}
int query(int o1,int o2,int i,int x)
{
	if(!i)return 0;
	int k=(x>>(i-1))&1;
	if(k)
	{
		if(p[p[o2].lc].val-p[p[o1].lc].val)return (1<<(i-1))+query(p[o1].lc,p[o2].lc,i-1,x);
		return query(p[o1].rc,p[o2].rc,i-1,x);
	}
	else 
	{
		if(p[p[o2].rc].val-p[p[o1].rc].val)return (1<<(i-1))+query(p[o1].rc,p[o2].rc,i-1,x);
		return query(p[o1].lc,p[o2].lc,i-1,x);
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	root[0]=insert(0,25,0);
	for(int i=1;i<=n;++i)
	{
		int x;
		scanf("%d",&x);
		pre^=x;
		root[i]=insert(root[i-1],25,pre);
	}
	while(m--)
	{
		char temp[3];
		scanf("%s",temp);
		if(temp[0]=='A')
		{
			int x;
			scanf("%d",&x);
			pre^=x;
			root[++n]=insert(root[n-1],25,pre);
		}
		else
		{
			int l,r,x;
			scanf("%d%d%d",&l,&r,&x);
			l-=2;
			r-=1;
			printf("%d\n",query(root[l],root[r],25,pre^x));
		}
	}
	return 0;
}
